#include "queue.h"
#include <malloc.h>

Queue QueueCreate()                                    /* 创建队列 */
{
    Queue ret;
    // 在下面写上你的代码
    ret.list = DYMListCreateList();
    ret.size = 0;

    return ret;
}
int QueuePushFront(Queue *queue, student elem)         /* 头部插入一个元素 */
{
    int ret = 0;
    // 在下面写上你的代码

    /* 为带存储元素创建空间 */
    student *buff = (student *)malloc(sizeof(student));
    *buff = elem;

    /* 将刚刚申请的空间首地址放入双循环链表中 */
    if( DYMListPushFront(&queue->list,(DYMListDataType)(buff)) )
    {
        /* size 增加 */
        queue->size++;

        ret = 1;
    }

    return ret;
}
int QueuePushBack(Queue *queue,student elem)          /* 尾部插入一个元素 */
{
    int ret = 0;
    // 在下面写上你的代码

    /* 为带存储元素创建空间 */
    student *buff = (student *)malloc(sizeof(student));
    *buff = elem;

    /* 将刚刚申请的空间首地址放入双循环链表中 */
    if( DYMListPushBack(&queue->list,(DYMListDataType)(buff)) )
    {
        /* size 增加 */
        queue->size++;

        ret = 1;
    }

    return ret;
}
int QueuePopFront(Queue *queue)                        /* 头部弹出一个元素 */
{
    int ret = 0;
    // 在下面写上你的代码
    
    /* 不要忘记，list 弹出的只是我们元素的地址，我们需要手动删除在 push 时申请的空间 */
    DYMListDataType waitToFree;
    if(DYMListPopFront(&queue->list, &waitToFree))
    {
        free(waitToFree);
        queue->size--;
        ret = 1;
    }

    return ret;
}
int QueuePopBack(Queue *queue)                         /* 尾部弹出一个元素 */
{
    int ret = 0;
    // 在下面写上你的代码
    /* 不要忘记，list 弹出的只是我们元素的地址，我们需要手动删除在 push 时申请的空间 */
    DYMListDataType waitToFree;
    if(DYMListPopBack(&queue->list, &waitToFree))
    {
        free(waitToFree);
        queue->size--;
        ret = 1;
    }

    return ret;
}
int QueuePeekFront(Queue *queue, student *buffer)      /* 头部查看一个元素，将头部元素写入 buffer */
{
    int ret = 0;
    // 在下面写上你的代码
    
    /* 其实这里应该使用提供 list 的 peek 函数来实现的，但是 list 没有实现 peek 函数，那么我们可以转换思路，可以先弹 list 出首元素，再将其插入 */
    DYMListDataType tmp;    // 首元素的地址
    if(!DYMListPopFront(&queue->list, &tmp))
    {
        return 0;
    }
    *buffer = *( (student*)(tmp) );
    if(!DYMListPushFront(&queue->list, tmp))
    {
        return 0;
    }
    ret = 1;

    return ret;
}
int QueuePeekBack(Queue *queue, student *buffer)       /* 尾部查看一个元素，将尾部元素写入 buffer */
{
    int ret = 0;
    // 在下面写上你的代码
    /* 其实这里应该使用提供 list 的 peek 函数来实现的，但是 list 没有实现 peek 函数，那么我们可以转换思路，可以先弹出 list 尾元素，再将其插入 */
    DYMListDataType tmp;    // 首元素的地址
    if(!DYMListPopBack(&queue->list, &tmp))
    {
        return 0;
    }

    *buffer = *( (student*)(tmp) );    /* 向 buffer 填入数据*/

    if(!DYMListPushBack(&queue->list, tmp))
    {
        return 0;
    }
    ret = 1;

    return ret;
}
void QueueDestory(Queue *queue)                        /* 销毁队列 */
{
    // 在下面写上你的代码
    DYMListDestoty(&queue->list);
    queue->size = 0;
}
